﻿using MongoDB.Bson;
using MongoDB.Driver;

namespace MongoDbDemo
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 1.连接字符串（mongodb数据库默认端口为：27017）
            string connStr = "mongodb://127.0.0.1:27017";

            // 2.创建连接MongoClient实例实际上代表了一个到数据库的连接池，即使有多个线程，也只需要一个MongoClient类的实例
            var client = new MongoClient(connStr);

            // 3.使用client的GetDatabase方法获取数据库，即使该数据库不存在，也会自动创建
            IMongoDatabase db = client.GetDatabase("test");

            // 4.获取数据集 collection; BsonDocument是在数据没有预先定义好的情况下使用的
            IMongoCollection<BsonDocument> collection = db.GetCollection<BsonDocument>("runoob1");

            // 5.插入一条数据
            var document = new BsonDocument() { { "id", 2 }, { "name", "aa" } };
            collection.InsertOne(document);

            // 6.查询数据1
            var res = collection.Find(new BsonDocument()).ToList(); // 查询整个数据集
            foreach (var item in res) 
            {
                Console.WriteLine(item);
            }
            // 6.查询数据2
            var res_a = collection.Find(new BsonDocument()).FirstOrDefault(); // 查询当前数据集的第一条数据，没用则返回null
            Console.WriteLine(res_a);

            // 6.升序降序查询3
            var sort_ascending = Builders<BsonDocument>.Sort.Ascending("id"); // 根据id升序
            var sort_descending = Builders<BsonDocument>.Sort.Descending("id"); // 根据id降序
            var res_c = collection.Find(Builders<BsonDocument>.Filter.Lt("id", 10)
                & Builders<BsonDocument>.Filter.Gte("id", 2)).Limit(50).Sort(sort_descending).ToCursor(); // 查询id大于10，小于2的数据
            foreach (var item in res_c.ToEnumerable())
            {
                Console.WriteLine(item);
            }

            // 7.更新数据，更新支持添加新的field，如：
            //collection.UpdateMany(Builders<BsonDocument>.Filter.Eq("id", 2), Builders<BsonDocument>.Update.Set("name", "hello")); // 将id字段为2的名字都改为“hello”

            // 8.删除
            //collection.DeleteMany(Builders<BsonDocument>.Filter.Eq("id", 2));
        }
    }
}
